home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / vbcc / machines / amiga68k / libsrc / amigalib / liballocpooled.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-20  |  1.9 KB  |  68 lines

  1. #include <pool.h>
  2.  
  3. APTR LibAllocPooled(APTR poolHeader, ULONG memSize)
  4. {
  5.   if (SysBase->LibNode.lib_Version>=39)
  6.     return (AllocPooled(poolHeader,memSize));
  7.   else
  8.   {
  9.     POOL *pool=(POOL *)poolHeader;
  10.     ULONG *puddle=NULL;
  11.  
  12.     if (memSize!=0 && poolHeader!=NULL)
  13.     {
  14.       if (pool->ThreshSize>memSize)
  15.       {
  16.         struct MinNode *node=pool->PuddleList.mlh_Head;
  17.  
  18.         for(;;)
  19.          {
  20.            struct MemHeader *a;
  21.            ULONG size;
  22.  
  23.            if ((ULONG *)node->mln_Succ!=puddle /* NULL! */)
  24.            {
  25.              if ((puddle=(ULONG *)Allocate((struct MemHeader *)node,memSize))!=NULL)
  26.                break;
  27.              node=node->mln_Succ; continue;
  28.            }
  29.            size=pool->PuddleSize+sizeof(struct MemHeader)+2*sizeof(ULONG);
  30.            if ((puddle=(ULONG *)AllocMem(size,pool->MemoryFlags))==NULL)
  31.              goto out; /* why is gcc so dumb ??? */
  32.  
  33.            *puddle++=size;
  34.            a=(struct MemHeader *)puddle;
  35.            a->mh_Lower=a->mh_First=(struct MemChunk *)((UBYTE *)a+sizeof(struct MemHeader)+sizeof(UBYTE *));
  36.            a->mh_First->mc_Next=NULL;
  37.            a->mh_Free=a->mh_First->mc_Bytes=pool->PuddleSize;
  38.            a->mh_Upper=(char *)a->mh_First+a->mh_Free;
  39.            AddHead((struct List *)&pool->PuddleList,&a->mh_Node);
  40.            puddle=(ULONG *)Allocate(a,memSize);
  41.            break;
  42.          }
  43.  
  44.         if (pool->MemoryFlags&MEMF_CLEAR)
  45.         {
  46.           ULONG *p=puddle;
  47.  
  48.           memSize=(memSize+7)>>3;
  49.           do { *p++=0; *p++=0; } while(--memSize);
  50.         }
  51.       }
  52.       else
  53.       {
  54.         ULONG size=memSize+sizeof(struct MinNode)+sizeof(ULONG);
  55.  
  56.         if ((puddle=(ULONG *)AllocMem(size,pool->MemoryFlags))!=NULL)
  57.         {
  58.           *puddle++=size;
  59.           AddHead((struct List *)&pool->ThreshList,(struct Node *)puddle);
  60.           puddle=(ULONG *)((struct MinNode *)puddle+1);
  61.         }
  62.       }
  63.     }
  64. out:
  65.     return puddle;
  66.   }
  67. }
  68.